package com.maven.mybatis.Mapper;


// 这里我们用来 数据库 的操作

import com.maven.mybatis.model.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;


// 这个 类使用 注解 的方式 来实现 持久层的操作

// 这个mapper 说明 这个类是 有关数据库操作的，或者说是 持久化的 操作

@Mapper
public interface UserMapper {
    @Results(id = "BaseResult" , value = {
            @Result(column = "delete_flag" ,property = "deleteFlag"),
            @Result(column = "create_time" ,property = "createTime"),
            @Result(column = "create_time" ,property = "updateTime")
    })


    // 这个 select 就相当于 jdbc 中的 sql 语句---方法的实现
    @Select("select id, username, password,age,gender,phone,"+
            "delete_flag as deleteFlag, " +
            "create_time as createTime, " +
            "create_time as updateTime from userinfo")
    // 这里是方法的定义
    List<UserInfo> queryUserList();

    // 上述方法是查询 全部内容，那如果需要根据某一列进行查询呢
    // 这时就需要用到 sql 中的 符号？ ： #{ }
    @ResultMap(value = "BaseResult")
    @Select("select * from userinfo where id = #{userId} ")
    List<UserInfo> queryUserById(Integer userId);



    // 上述 只有一个参数，那要是有多个 呢
    // 实际上 mybatis 会默认 将 你传入 的参数 给进行命名：param1 ，param2
    @Select("select * from userinfo where id = #{userid} and delete_flag = #{param2}")
    List<UserInfo> queryUserByDF(Integer userid , Integer deleteFlag);


    // 如果我们 自己要进行重命名呢
    // 我们就需要使用 @Param（" newname "） 进行重命名， 所以我们就可以用 newname 来表示之前的 参数
    @Select("select * from userinfo where id = #{id} and delete_flag = #{param2}")
    List<UserInfo> queryUserParam(@Param("id") Integer userId , Integer deleteFlag);


    //增
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into userinfo(id,username,password,age,gender) " +
            "values(#{id},#{username},#{password},#{age},#{gender})")
    Integer insert(UserInfo userInfo);

    // 删
    @Delete("delete from userinfo where id = #{userId}")
    Integer delete(Integer userId);

    // 改
    @Update("update userinfo set password = #{password} where id = #{userId}")
    Integer update(String password , Integer userId);


    // 查 ： 上述已经实现了 select 的 功能
    // 不过 存在些许 问题 ：就是 我们的 Java变量名 与 数据库的 变量名 不一致时就无法 将值传递过来
    // 我们有三种方式 来解决上述问题
    // 1. 修改别名
    // select delete_flag as deleteFlag

    // 2. 通过 注解 来 说明映射关系
    // 先通过 @Results 说明映射关系
    // @Results(id = "BaseResult" , value = {
    //            @Result(column = "delete_flag" ,property = "deleteFlag"),
    //            @Result(column = "create_time" ,property = "createTime"),
    //            @Result(column = "create_time" ,property = "updateTime")
    //    })
    // 在 通过 @ResultMap 进行引用

    // 3. 修改配置来 实现 自动驼峰转化
//    mybatis:
//     configuration:
//      map-underscore-to-camel-case: true #配置驼峰自动转换



    // 如果 我们 在查询的 过程中 需要返回 某个主键
    // 我们 可以 用  @Options(useGeneratedKeys = true,keyProperty = "id")
    //                      这里设置 true：允许取出主键     这个是 说明 哪一列
}
